<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>函数参数</title>
</head>
<body>
<script>
    function sum(x,y){
        console.log(x+y)
    }

    /*
    * 函数在调用的时候传递参数 本质是将参数传递给函数内部的arguments对象(箭头函数除外) 然后
    * 把实参从arguments中取出赋值到函数的形参参数上 所以函数的参数不是必须的 你不写的话使用arguments[]的方式也可以获取
    * */
    sum(1,2)


    /*
    * 修改arguments中的数据会被直接同步到对应的命名参数上、但是他们在内存中的表现是分开的 只是会保持同步而已
    * */

    function foo1(a, b) {
        arguments[0] = 100
        console.log(a)
    }

    function foo2(a,b) {
        /*
        * arguments的长度是实参的数量 这里在调用的时候并没有传递第二个参数 所以吧不能这样使用
        * */


        arguments[1] = 200
    }
    foo2(100)

    /*
    * 上面演示的只是未开启严格模式下的结果 开启严格模式下不能通过修改arguments的值来影响声明参数
    * */

    /*
    * arguments是伪数组，其实不能使用数组的API 但是为什么可以使用[]访问呢 因为对象也可以使用[]来访问属性
    * */

</script>
</body>
</html>